package com.xuln.framework.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;

import com.xuln.common.util.PaginationSupport;

public interface IBaseDao<T, PK extends Serializable> {

	/**
	 * 清除缓存
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010 void
	 */
	public void clear();

	/**
	 * 通过ID判断实体是否存在
	 * 
	 * @param id
	 *            实体ID
	 * @return - true if it exists, false if it doesn't
	 */
	public boolean exists(PK id);

	/**
	 * 加载所有的实体
	 */
	public List<T> loadAll();

	/**
	 * 加载实体
	 */
	@SuppressWarnings("unchecked")
	public T load(PK id);

	/**
	 * 根据ID查找实体
	 */
	@SuppressWarnings("unchecked")
	public T get(PK id);

	/**
	 * 根据hql和可变参数数组查询
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param hql
	 * @param values
	 *            可变参数数组
	 * @return List<T>
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String hql, Object... values);

	/**
	 * 根据hql和可变参数数组查询，返回第一条记录
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param hql
	 * @param values
	 *            可变参数数组
	 * @return List<T>
	 */
	@SuppressWarnings("unchecked")
	public T findTop1Entity(String hql, Object... values);

	/**
	 * 根据给定的实例查找实体
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByExample(T entity);

	/**
	 * 根据ID查找实体
	 */
	public T findById(PK id);

	/**
	 * 根据hql查询,map存储参数 <br>
	 * String hql = "from MyEntity where name=:paramName";
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param hql
	 * @param map
	 *            <String, Object>
	 * @return List<T>
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByMap(String hql, Map<String, Object> map);

	/**
	 * 根据某个具体属性进行查找
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByProperty(String propertyName, Object value);

	/**
	 * 执行采用本地SQL
	 * 
	 * @param sql
	 * @param values
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List findByQuerySQL(String sql, Object... values);

	/**
	 * 如果对象已在本session中持久化了,覆盖原有的<br>
	 * 如果session中没有对应对象,从数据库加载<br>
	 * 如果是脱管对象,则什么都不做
	 * 
	 * @param entityObject
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T merge(T entity);

	/**
	 * 保存实体
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param entity
	 * @return PK
	 */
	@SuppressWarnings("unchecked")
	public PK save(T entity);

	/**
	 * 保存或更新实体
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param entity
	 *            void
	 */
	@SuppressWarnings("unchecked")
	public void saveOrUpdate(T entity);

	/**
	 * 保存或更新实体集合
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 3, 2010
	 * @param entities
	 *            void
	 */
	@SuppressWarnings("unchecked")
	public void saveOrUpdateAll(List<T> entities);

	/**
	 * 更新已存在的实体
	 */
	public void update(T entity);

	/**
	 * 删除指定ID的实体
	 */
	public void deleteById(PK id);

	/**
	 * 删除指定实体
	 */
	public void delete(T entity);

	/**
	 * 删除指定实体集合
	 */
	public void deleteAll(List<T> entities);

	/**
	 * 执行更新语句
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 7, 2010
	 * @param hql
	 * @param values
	 * @return int
	 */
	public int executeUpdate(String hql, Object... values);

	/**
	 * 根据hql加载分页，默认页大小，从第0条开始
	 */
	public PaginationSupport findPageByQuery(String hql, Object... values);

	/**
	 * 根据hql加载分页，默认页大小，从第startIndex条开始
	 */
	public PaginationSupport findPageByQuery(String hql, int startIndex, Object... values);

	/**
	 * 根据hql加载分页，指定页大小和起始位置
	 */
	@SuppressWarnings("unchecked")
	public PaginationSupport findPageByQuery(String hql, int startIndex, int pageSize, Object... values);

	/**
	 * 根据hql统计总数
	 */
	@SuppressWarnings("unchecked")
	public int getCountByQuery(String hql, Object... values);

	/**
	 * 调用方式如下： <br>
	 * dao.createQuery(hql)<br>
	 * dao.createQuery(hql,arg0);<br>
	 * dao.createQuery(hql,arg0,arg1); <br>
	 * dao.createQuery(hql,new Object[arg0,arg1,arg2])<br>
	 * 
	 * @param values
	 *            可变参数.
	 */
	public Query createQuery(String hql, Object... values);

	/**
	 * 根据sql加载分页，默认页大小，从第0条开始
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com 2010-3-25
	 * @param sql
	 * @param values
	 * @return PaginationSupport
	 */
	public PaginationSupport findPageByQuerySQL(String sql, Object... values);

	/**
	 * 根据sql加载分页，默认页大小，从第startIndex条开始
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com 2010-3-25
	 * @param sql
	 * @param startIndex
	 * @param values
	 * @return PaginationSupport
	 */
	public PaginationSupport findPageByQuerySQL(String sql, int startIndex, Object... values);

	/**
	 * 根据hql加载分页，指定页大小和起始位置
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com 2010-3-25
	 * @param sql
	 * @param pageSize
	 * @param startIndex
	 * @param values
	 * @return PaginationSupport
	 */
	@SuppressWarnings("unchecked")
	public PaginationSupport findPageByQuerySQL(String sql, int pageSize, int startIndex, Object... values);

	/**
	 * 得到总的记录数
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com 2010-3-26
	 * @param sql
	 * @param values
	 * @return int
	 */
	public int getCountByQuerySQL(String sql, Object... values);

	/**
	 * 执行SQL查询语句
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com 2010-3-26
	 * @param sql
	 * @param values
	 * @return Query
	 */
	@SuppressWarnings("unchecked")
	public Query createSQLQuery(String sql, Object... values);

	/**
	 * 执行SQL语句
	 * 
	 * @lastmodify : 徐炉南 xinlunan487@163.com Aug 5, 2010
	 * @param sql
	 * @return boolean
	 */
	public int excuteSql(String sql, Object... values);

	public void initialize(Object proxy);

	public void refresh(T entity);

	public void flush();

	public Long getKey();

	public void setNextKey(Long nextKey);

	public void putTalbeKeys();
}
